#ifndef __SWEI_PACKAGE_H
#define __SWEI_PACKAGE_H



#include "service/include/swei_common.h"



#ifdef __cplusplus
extern "C" {
#endif



/* 通用消息队列中消息体的最大长度 */
#define MSG_CONTENT_LEN 256
/* 队列通用消息结构体 */
#pragma pack(1)
typedef struct
{   
    /* 消息类型*/
    uint8_t  msg_type;
    /* 实际消息长度 */
    uint8_t  msg_len;
    /* 保存消息内容的buffer,简单处理用数组来保存-可能会有浪费*/
    uint8_t  msg_content[MSG_CONTENT_LEN];
}common_msg_st;
#pragma pack()


// 协议头部数据
#pragma pack(1)
typedef struct
{
    uint16_t  head;        // 起始位 0x7a7a
    uint16_t  len;         // 包长度
    uint32_t  working_id;  // tbox工作ID,详细含义请参考赛维-云平台通讯协议
    uint32_t  timestamp;   // 时间戳
    uint16_t  serial_num;  // 序列号
} NET_PROTOCOL_HEAD_ST;
#pragma pack()


// 协议尾部数据
#pragma pack(1)
typedef struct
{
    uint16_t   crc;  // 校验位
    uint16_t   tail; // 停止位0x0d0a
} NET_PROTOCOL_TAIL_ST;
#pragma pack()

#define NET_PROTOCOL_HEAD_NUM (0x7a7a)
#define NET_PROTOCOL_TAIL_NUM (0x0d0a)

/* 协议的标识符 */
#define NET_PROTOCOL_ID_LOGIN                  (0x0001) // 登录包
#define NET_PROTOCOL_ID_HEART_BEAT             (0x0002) // 心跳包
#define NET_PROTOCOL_ID_GPS                    (0x0003) // gps包
#define NET_PROTOCOL_ID_LBS                    (0x0004) // 基站包
#define NET_PROTOCOL_ID_WIFI                   (0x0005) // wifi包
#define NET_PROTOCOL_ID_WARNING                (0x0006) // 告警信息包
#define NET_PROTOCOL_ID_DEVICE_STATUS          (0x0007) // 设备状态包
#define NET_PROTOCOL_ID_PLATFORM_ACK           (0x0008) // 平台通用应答信息包   平台-->设备
#define NET_PROTOCOL_ID_DEVICE_ACK             (0x0009) // 设备通用应答信息包   设备-->平台
#define NET_PROTOCOL_ID_DOWNLINK               (0x000A) // 服务器下行包         平台-->设备
#define NET_PROTOCOL_ID_DEVICE_CMD_ACK         (0x000B) // 设备指令回复包       设备-->平台
#define NET_PROTOCOL_ID_REQUEST_ACTIVATE       (0x000C) // 设备请求激活信息包       设备-->平台
#define NET_PROTOCOL_ID_REQUEST_ACTIVATE_ACK   (0x000D) // 请求激活信息应答     平台-->设备
#define NET_PROTOCOL_ID_UPLOAD_CONFIG_INFO     (0x000E) // 配置信息上报      设备-->平台
#define NET_PROTOCOL_ID_LOGSTEP_NEW              (0x000F) // 登录包

//协议版本
#define NET_PROTOCOL_VERSION                   (0x09)


#pragma pack(1)
/* 登录消息消息体  */
typedef struct
{
    /* 同步头 */
    uint16_t sync_head;
    /* 消息长度 */
    uint16_t len;
    /* 消息序列号 */
    uint16_t seq;
    /* 协议ID@ref NET_PROTOCOL_ID_XX */
    uint16_t protocol_id; 
    /* imei信息*/
    uint8_t imei[8];
    /* sn */
    uint8_t sn[20];
    /* username */
    uint8_t user_name[20];
    /* passwd */
    uint8_t passwd[20];
    /* type code */
    uint16_t type_code;
    /* 协议版本号*/
    uint8_t protocol_ver;
    /* crc-16 校验*/
    uint16_t crc;
    /* 结束符 */
    uint16_t sync_end;
} login_msg_st;
#pragma pack()





int32_t swei_packet_message(data_type_e type, uint8_t *data, uint16_t data_len);
int32_t swei_package_protocol_msg(common_msg_st *p_common_msg, uint8_t *p_in_data, uint16_t protocol_id, uint8_t *p_out_protocol_data);
int32_t swei_location_scan_gps_info(common_msg_st *msg, uint8_t upload_mode);
int32_t swei_location_scan_lbs_info(common_msg_st *msg);
int32_t swei_location_scan_wifi_info(common_msg_st *msg);
int32_t swei_location_scan_rsrp_info(common_msg_st *msg);
int32_t swei_location_scan_dev_data_info(common_msg_st *msg);
int32_t swei_location_scan_batt_info(common_msg_st *msg);
#ifdef __cplusplus
}
#endif

#endif // end of __SWEI_PACKAGE_H
